import java.util.*;

//哈希表_字母异位词分组
//https://leetcode.cn/problems/group-anagrams/description/
public class Test {
    public static void main(String[] args) {
        //
        Solution s = new Solution();
        //String[] strs = {"eat","tea","tan","ate","nat","bat"};
        String strs = "jdinbihoiajd";
        String sss = s.sortFunc(strs);
    }
}

/*class Solution {
    private StringBuilder sortFunc(String str){
        StringBuilder sort = new StringBuilder();
        int[] chars = new int[26];//每个字母出现的次数
        for(int i = 0 ; i < str.length() ; i++){
            chars[str.charAt(i) - 'a']++;
        }
        for(int i = 0 ; i < 26 ; i++){
            while(chars[i] > 0){
                sort.append(chars[i]);
                chars[i] --;
            }
        }
        return sort;
    }
    public List<List<String>> groupAnagrams(String[] strs) {
        //返回：
        List<List<String>> list = new ArrayList<>();
        //存储：出现过的有序字母串，及字母串组成的字符串
        Map<String, List<String>> map = new HashMap<>();
        for(String s : strs) {//遍历字符数组
            //1.排序
            String sss = (String)sortFunc(s);
            if(!map.containsKey(sss)){//没有出现过，加上
                map.put(sss, new ArrayList<>());//注意这里的处理
                map.get(sss).add(s);
            }else{
                map.get(sss).add(s);//出现过，直接value部分加上
            }
        }
        for(String key : map.keySet()){
            list.add(map.get(key));
        }
        return list;

    }
}*/


/*
class Solution {
    public StringBuilder sortFunc(String str){
        StringBuilder sort = new StringBuilder();
        int[] chars = new int[26];//每个字母出现的次数
        for(int i = 0 ; i < str.length() ; i++){
            chars[str.charAt(i) - 'a']++;
        }
        for(int i = 0 ; i < 26 ; i++){
            while(chars[i] > 0){
                sort.append(chars[i]+'a');
                chars[i] --;
            }
        }
        System.out.println(sort.toString());
        return sort;
    }
    public List<List<String>> groupAnagrams(String[] strs) {
        //返回：
        List<List<String>> list = new ArrayList<>();
        //存储：出现过的有序字母串，及字母串组成的字符串
        Map<StringBuilder, List<String>> map = new HashMap<>();
        for(String s : strs) {//遍历字符数组
            //1.排序
            StringBuilder sss = sortFunc(s);
            if(!map.containsKey(sss)){//没有出现过，加上
                map.put(sss, new ArrayList<>());//注意这里的处理
                map.get(sss).add(s);
            }else{
                map.get(sss).add(s);//出现过，直接value部分加上
            }
        }
        for(StringBuilder key : map.keySet()){
            list.add(map.get(key));
        }
        return list;

    }
}*/




//自己写的
 class Solution {
     public String sortFunc(String str){
         String sort = "";
         int[] chars = new int[26];//每个字母出现的次数
         for(int i = 0 ; i < str.length() ; i++){
             chars[str.charAt(i) - 'a']++;
         }
         for(int i = 0 ; i < 26 ; i++){
             while(chars[i] > 0){
                 sort += (char)(i + 'a');
                 chars[i] --;
             }
         }
         //System.out.println(sort);
         return sort;
     }
     public List<List<String>> groupAnagrams(String[] strs) {
         //返回：
         List<List<String>> list = new ArrayList<>();
         //存储：出现过的有序字母串，及字母串组成的字符串
         Map<String, List<String>> map = new HashMap<>();
         for(String s : strs) {//遍历字符数组
             //1.排序
             String sss = sortFunc(s);
             if(!map.containsKey(sss)){//没有出现过，加上
                 map.put(sss, new ArrayList<>());//注意这里的处理
                 map.get(sss).add(s);
             }else{
                 map.get(sss).add(s);//出现过，直接value部分加上
             }
         }
         for(String key : map.keySet()){
             list.add(map.get(key));
         }
         return list;

     }
 }


 //老师的写法
 class Solution2 {
     public List<List<String>> groupAnagrams(String[] strs) {
         //
         Map<String, List<String>> map = new HashMap<>();
         for(String s : strs){//将字符串分组
             char[] chars = s.toCharArray();
             Arrays.sort(chars);
             String key = new String(chars);
             if(!map.containsKey(key)){//没有过，先给“value”部分创造一个空间：new ArrayList<>()
                 map.put(key, new ArrayList<>());
             }
             map.get(key).add(s);
         }

         //提取结果
         return new ArrayList<>(map.values());//这种创建方式
     }
 }




















